package com.ceolt.biz.impl;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import com.ceolt.biz.ITestingBiz;
import com.ceolt.dao.IBaseTermDao;
import com.ceolt.dao.ITestRecordDao;
import com.ceolt.entity.BaseTerm;
import com.ceolt.entity.TestRecord;
import com.ceolt.entity.Vocabulary;
import com.ceolt.entity.Word;
import com.ceolt.exception.NoTestRecordException;
import com.ceolt.util.BeanFactory;

/***********************************
 * 
 * @description 测试业务所需要擞 据操作
 * @author yejf
 * @date 2013-7-5 上午11:08:49
 * @version jdk1.6
 *
 */
public class TestingBizImpl implements ITestingBiz {

	// 引用Dao
	private ITestRecordDao testRecordDao;

	private IBaseTermDao baseTermDao;
	
	public TestingBizImpl() {
		//初始化dao
		this.testRecordDao = (ITestRecordDao) BeanFactory.getBean("testRecordDao");
		this.baseTermDao = (IBaseTermDao) BeanFactory.getBean("baseTermDao");
	}

	/*
	 * 此方法从原始的单词和词汇数据中，随机抽取出指定数量的数据，并以 List集合返回
	 * 
	 * @see com.tz.cels.service.ITestingService#getTestingData(int)
	 */
	@Override
	public List<BaseTerm> getTestingData(int num) {
		// 1.创建一个 List
		List<BaseTerm> allDatas = new ArrayList<>();
		// 加载出所有单词和词汇，并把它们都放到这个集合中
		Set<Word> words = baseTermDao.getAllWords();
		for (Word w : words) {
			allDatas.add(w);
		}
		// 加载词汇
		Set<Vocabulary> vocubularies = baseTermDao.getAllVocabularies();
		for (Vocabulary v : vocubularies) {
			allDatas.add(v);
		}
		// 3.打乱这整个 List
		Collections.shuffle(allDatas);
		// 4.获取起始位置
		int fromIndex = num / 2;
		int endIndex = fromIndex + num;
		// 创建一个需要返回集合
		List<BaseTerm> testData = new ArrayList<>();
		for (int i = fromIndex; i < endIndex; i++) {
			testData.add(allDatas.get(i));
		}
		// 返回
		return testData;
	}

	/*
	 * 查看已经保存过的测试数据，只需直接读到即可
	 * 
	 * @see com.tz.cels.service.ITestingService#reviewTestRecord()
	 */
	@Override
	public List<TestRecord> reviewTestRecord() throws NoTestRecordException {
		// 1.创建 File
		File dir = new File(TESTRECORD_DIR);
		if (!dir.exists()) {
			dir.mkdirs();
		}
		// 创建文件的 file对象
		File file = new File(dir, TEST_RECORD_FILE);
		// 判断此文件 是否存在
		if (!file.exists()) {
			throw new NoTestRecordException("你还没有过测试的历史记录");
		}
		// 如果没有抛出异常，则调用 dao 来读取数据
		return testRecordDao.read(file.getAbsolutePath());
	}

	/*
	 * @see
	 * com.tz.cels.service.ITestingService#saveTestRecord(com.tz.cels.entity.
	 * TestRecord)
	 */
	@Override
	public boolean saveTestRecord(TestRecord record) {
		// 1.判断存在测试记录的目录是否存在，如果不存在，则创建它
		File dir = new File(TESTRECORD_DIR);
		if (!dir.exists()) {
			// 创建它
			dir.mkdirs(); // 创建 data/record 的目录结构
		}
		// 2.创建一个集合，存放我们需要写入文件的测试数据
		List<TestRecord> newRecords = null;
		// 创建真正写入数据的文件
		File file = new File(dir, TEST_RECORD_FILE);
		// 判断此文件是否存在
		if (file.exists()) {
			// 说明已经存在了测试记录的文件， 那就先读取原来的数据
			newRecords = testRecordDao.read(file.getAbsolutePath());
			//
			if (newRecords != null) {
				// 把现有的测试对象添加到此集合中
				newRecords.add(record);
				// 为了业务，需要把最近的测试记录，显示在最前面
				Collections.sort(newRecords);
			}
		} else {
			// 说明测试记录文件不存在，那就是第一次保存，直接构造一个集合，并把record放到集合中
			newRecords = new ArrayList<>();
			// 添加现在的对象
			newRecords.add(record);
		}
		// 再把集合持久化到 文件中
		try {
			testRecordDao.write(newRecords, file.getAbsolutePath());
			//持久化成功，返回 true
			return true;
		} catch (RuntimeException e) {
			//出现异常，返回 false
			return false;
		}
	} 

}
